﻿/************************************************************************************
 * 漠然(459699936@qq.com) 2015/1/7 17:40:10
 ************************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace Justin
{


    class AppManager
    {
        public static void RegisterManager(string managerName, IManager manager) {
            //注册管理容器
        }

        //将服务注册到对应分支管理
        internal static object Register(string managerName, DemoService demoService) {
            throw new NotImplementedException();
        }
    }




    class DemoServiceManager
    {
        //这里面负责服务的创建，生命周期管理和安全控制
    }


    //解析器
    //


    class DemoService
    {

        public DemoService() {
            //解析插件服务
            var manager = AppManager.Register("Service", this);
        }

        //从AppManager里查询它对应的管理容器
        // 将插件注册到对应管理器里面
        //
    }



    class AddinLoader
    {

        public void Scan() {
            //扫描 插件目录下面的所有插件描述文件
        }


        public void LoadModule(string file) {
            //单个加载插件描述文件并且执行解析
            var doc = XDocument.Load(file);
            if (doc.Root != null) {
                //创建模块类
                //
                //然后执行模块类
                //执行解析工作
                foreach (var node in doc.Root.Elements()) {
                    var an = GetAnalyser(node.Name);
                    var addin = an.Analyse(node);
                    // 模块缓存 addin
                    // 
                }
            }
        }

        private IAnalyse GetAnalyser(XName xName) {
            throw new NotImplementedException();
        }



    }

    //
    // 插件系统的核心思想：
    //   假设 A B C 为3个人 A是用户 B是中介公司 C则是一个技术员
    //   现在A公司出现了一个情况 需要一个具有某种技能技术员 但是A不认识 C 那么就可以通过B 由B来介绍给A 

    // 插件的内核就是担任这个中间人的角色，因此需要做的工作：
    //    1.提供一个注册协议，让内核认识插件
    //    2.提供一个请求协议，让用户可以通过需求来获取注册到内核中的插件
    //    3.提供插件的内部管理工作方便快速的照到插件提供方
    //    4.插件通信： 
    //         插件接收内核的通知 //监听内核通知事件
    //         插件要求退出内核   //内核监听事件
    //         用户要求插件功能   //通过插件接口


    // 插件内核的启动步骤；
    //   1.扫描所有的插件协议文件 x.addin 并且解析到插件描述对象之中
    //   2.检查所有的协议对象
    //       对存在更新的执行更新解压缩
    //       对禁用插件进行协议对象隔离
    //       对已经卸载的插件进行文件删除工作[为了对系统的不造成影响要求存放的是时候将不同的插件放在不同的命名目录下面]
    //       执行插件加载[逻辑加载或者实际加载]
    //           逻辑加载只加载相应的接口文件
    //           实际加载就将接口文件也加载进去
    //       将插件按照配置推送给具体的管理容器

    // 用户使用接口的简化:
    //    全局单例模式? 对于用户来说是不需要区分单例模式的,但是对于创建部分来说则是需要区分的。
    //           Service提供两个创建容器：
    //               1.一个提供快速创建单例模式
    //               2.一个提供快速创建普通对象
    //          服务对象获取接口：
    //               1.GetSingletonService();
    //               2.GetService();             用户自己不需要对模式进行判定
    //               3.GetCommonService();
    //          服务管理接口：
    //               1.添加服务
    //               2.移除服务
    //          服务:提供接口 提供GUID 提供描述
    

}
